# Асинхронное считывание данных из файлов с использованием колбеков

Функция read_cb() находит все файлы текущей директории, далее переходит к считыванию данных из найденных файлов.
По завершению чтения последнего файла выводит результат.

```js
const
   fs             = require('fs'),
   path           = require('path');

function read_cb() {
   // Чтение списка файлов текущей директории (вариант с использованием колбеков).

   const
      listNameFiles  = [],
      listReadFiles  = [];

   let
      countFiles     = 0,
      countReadFiles = 0;
   
   console.log('1) Запускаем поиск файлов в папке ' + __dirname);

   // Асинхронный поиск файлов директории.
   fs.readdir(__dirname, (err, files) => {

      console.log('2) Done - в папке найдены следующие файлы:');
      for (let i = 0; i < files.length; i++) {
         let file = files[i];
         // Файлы добавляем в список.
         if (fs.statSync(path.join(__dirname, file)).isFile()) {
            listNameFiles.push(file);
            countFiles++;
         }
      }
      console.log('   ' + listNameFiles.join(' | '));

      console.log('3) Запускаем считывание данных из файлов, данные приходят в следующем порядке:');
      // Идём по перечню файлов.
      for (const file of listNameFiles) {
         
         // Асинхронно читаем данные файла.
         fs.readFile(file, 'utf-8', (err, fileData) => {
            if (!err) {
               countReadFiles++;                  
               listReadFiles.push(file);
               
               // Если прочитаны все файлы.
               if (countReadFiles === countFiles) {
                  console.log('   ' + listReadFiles.join(' | '));
                  console.log('4) Done - все файлы считаны.');
               }
            }
         });

      }
      
   });
}

read_cb();
```

Вывод функции:
```
1) Запускаем поиск файлов в папке C:\js\
2) Done - в папке найдены следующие файлы:
   app.js | app0.js | app2.js | app3.js | package-lock.json | package.json | t1.txt | t11.txt | t2.txt
3) Запускаем считывание данных из файлов, данные приходят в следующем порядке:
   app.js | app0.js | app3.js | app2.js | package.json | t11.txt | t2.txt | t1.txt | package-lock.json
4) Done - все файлы считаны.
```

# Асинхронное считывание данных из файлов с использованием async/await
Функция read_prom() находит все файлы текущей директории, далее переходит к считыванию данных из найденных файлов.
По завершению чтения последнего файла выводит результат.


```js
const
   fs             = require('fs'),
   util           = require('util'),
   path           = require('path');

async function read_prom() {
   // Асинхронная функция Чтения списка файлов текущей директории.

   const
      listNameFiles  = [],
      listReadFiles  = [];
   
   // Функции fs.readdir() и fs.readFile(), использующие колбеки, оборачиваем функцией, которая позволит использовать промисы.
   const readdirAsync  = util.promisify(fs.readdir);
   const readFileAsync = util.promisify(fs.readFile);
      
   console.log('1) Запускаем поиск файлов в папке ' + __dirname);   
   // Ждём завершения работы асинхронного чтения файлов текущей директории.
   let files = await readdirAsync(__dirname).catch(err => {});
   await files.map(fn => {
      // Файлы добавляем в список.
      if (fs.statSync(path.join(__dirname, fn)).isFile()) {
         listNameFiles.push(fn);
      }      
   })
   console.log('2) Done - в папке найдены следующие файлы:');
   console.log('   ' + listNameFiles.join(' | '));

   console.log('3) Запускаем считывание данных из файлов, данные приходят в следующем порядке:');
   
   // Ждём завершения всех промисов, добавленных в массив при вызове метода map.
   Promise.all(
      listNameFiles.map(async file => {
         // Ждём завершения считывания.
         const dataFile = await readFileAsync(file, 'utf8').catch(err => console.log('Ошибка чтения файла: ' + err.code) );
         listReadFiles.push(file);
      })   
   ).then(() => {
      console.log('   ' + listReadFiles.join(' | '));
      console.log('4) Done - все файлы считаны.');   
   });

}
   
read_prom();
```
Вывод функции:
```
1) Запускаем поиск файлов в папке D:\tr\js\12jwt1
2) Done - в папке найдены следующие файлы:
   app.js | app00.js | app2.js | app3.js | package-lock.json | package.json | t1.txt | t11.txt | t2.txt
3) Запускаем считывание данных из файлов, данные приходят в следующем порядке:
   app.js | app00.js | app2.js | app3.js | package.json | t11.txt | t2.txt | package-lock.json | t1.txt
4) Done - все файлы считаны.
```
